package ar.com.photo_admin.service

import ar.com.photo_admin.service.assembler.AlbumAssembler;
import ar.com.photo_admin.service.assembler.EventAssembler
import grails.converters.*
import ar.com.photo_admin.domain.*;
import ar.com.photo_admin.service.dto.*;

class RemoteApiController {

	def eventAlbumService
	def eventAlbumTokenService
	def albumAssembler = new AlbumAssembler()
	def eventAssembler = new EventAssembler()
	
	/**
	 * Devuelve la informacion del album
	 * @param String token: token para autenticacion
	 * @param String albumId: Id del album a visualizar
	 **/
    def album() { 
		//Verifo que que me manden los parametros
		if (!params.token || !params.albumId) {
			log.error "No se han recibido los parametros necesarios"
			response.sendError(404)
			return;
		}
		
		// Verifico que el token exista.
		if(!eventAlbumTokenService.tokenExists(params.token)){
			respondError(new AlbumDTO(),"No existe el token")
			return
		}
		
		//Verifico que el album exista		
		if(!eventAlbumService.albumExists(params.albumId)){
			respondError(new AlbumDTO(),"No existe el album")
			return
		}
		
		//Verifico que el token de permisos al album
		if(!eventAlbumTokenService.tokenGrantsPermissionToAlbum(params.token,params.albumId)){			
			respondError(new AlbumDTO(),"No tiene permisos para ver el album")
			return
		}
		
		
		
		def album = EventAlbum.get(params.albumId)		
		def albumDTO = albumAssembler.toBean(album);
		render albumDTO as JSON
					
	}
	
	/**
	 * Devuelve el listado de albums 
	 * @param String token: nombre del token para autenticacion
	 **/
	def albumsList() {
		//Verifo que que me manden los parametros
		if (!params.token) {
			log.error "No se han recibido los parametros necesarios"
			response.sendError(404)
			return;
		}
		
		// Verifico que el token exista.
		if(!eventAlbumTokenService.tokenExists(params.token)){			
			respondError(new AlbumLightWeightListDTO(),"No existe el token")
			return
		}
		
		
		def albums = eventAlbumService.getAlbumsByToken(params.token)
		def albumsDTO = albumAssembler.toLightWeightBeans(albums);			
		def bean = new AlbumLightWeightListDTO(albums : albumsDTO)						
		render bean as JSON
											
	}
	
	/**
	 * Devuelve la informacion del evento
	 * @param String token: token para autenticacion
	 **/
    def event() { 
		//Verifo que que me manden los parametros
		if (!params.token) {
			log.error "No se han recibido los parametros necesarios"
			response.sendError(404)
			return;
		}
		
		// Verifico que el token exista.
		if(!eventAlbumTokenService.tokenExists(params.token)){
			respondError(new EventDTO(),"No existe el token")
			return
		}
		
		def event = eventAlbumTokenService.getEventFromToken(params.token)		
		
		// Verifico que el token tenga albums asociados. Si no los tiene no se puede recuperar el evento.
		if(event == null){
			respondError(new EventDTO(),"El token no tiene albums asociados")
			return
		}
		
		
		def eventDTO = eventAssembler.toBean(event);
		render eventDTO as JSON					
	}

	def respondError(bean,description){
		bean.status = BaseDTO.STATUS_ERROR
		bean.description = description
		render bean as JSON
	}
}
